//
//  NSTimeViewController.m
//  UILbrary
//
//  Created by mac on 17/3/2.
//  Copyright © 2017年 mac. All rights reserved.
//

#import "NSTimeViewController.h"

@interface NSTimeViewController ()

@end

@implementation NSTimeViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    
}
//http://www.cnblogs.com/QianChia/p/5782780.html#autoid-8-0-0

//1.NSDate 的创建
- (void)createDate{
    
//对象方法
    //当前时间 ，GMT 时间
    NSDate *date1 = [[NSDate alloc] init];
    
    //当前时间 n秒后的值
    NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
    
    //某个时间 增加n 秒后的值
    NSDate *date3 = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date2];
    
    //从 1970-01-01 00：00：00：00(GMT)增加n秒后的值
    NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600];
    
    //从2001-01-01 00:00:00(GTM) 增加n秒后的值
    NSDate *date5 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:10];

//类方法
    //当前时间 GMT 时间
    NSDate *date6 = [NSDate date];
    
    //当前时间 n 秒后的值
    NSDate *date7 = [NSDate dateWithTimeIntervalSinceNow:10];
    
    //某个时间 增加n秒后的值
    NSDate *date8 = [NSDate dateWithTimeInterval:10 sinceDate:date7];
    
    //从 1970-01-01 00：00：00：00(GMT)增加n秒后的值
    NSDate *date9 = [NSDate dateWithTimeIntervalSince1970:3600];
    
    //从2001-01-01 00:00:00(GTM) 增加n秒后的值
    NSDate *dete10 = [NSDate dateWithTimeIntervalSinceReferenceDate:10];
    
    //未来某个随机的时间
    NSDate *date11 = [NSDate distantFuture];
    
    //过去某一个随机时间
    NSDate *date12 = [NSDate distantPast];
    
    //指定时间间隔 某个时间增加n秒后的值
    NSDate *date13 = [date6 dateByAddingTimeInterval:20];
}

//2.NSDate 时间间隔的计算
- (void)theDifferentBetweenTowDate{
    NSDate *date1 = [NSDate date];
    NSDate *date2 = [date1 dateByAddingTimeInterval:20];
    
    //实例保存的时间 与 当前时间的时间间隔  单位 秒
    NSTimeInterval interval1 = [date2 timeIntervalSinceNow];
    
    //实例保存的时间 与 指定时间的 时间间隔 单位 秒
    NSTimeInterval interval2 = [date2 timeIntervalSinceDate:date1];

    //实例保存的时间 与 1970-01-01 00:00:00(GMT) 的时间间隔 单位 秒
    NSTimeInterval interval3 = [date1 timeIntervalSince1970];

    //实例保存的时间 与 2001-01-01 00:00;00(GMT) 的时间间隔 单位秒
    NSTimeInterval interval4 = [date1 timeIntervalSinceReferenceDate];

    //当前时间 与 2001-01-01 00:00:00(GMT) 的时间间隔 单位秒
    NSTimeInterval interval5 = [NSDate timeIntervalSinceReferenceDate];
}

//3.NSDate 时间的比较
- (void)compareTwoDate{
    NSDate *date1 = [NSDate date];
    NSDate *date2 = [date1 dateByAddingTimeInterval:10];
    
    //判断是否相等
    BOOL b1 = [date1 isEqualToDate:date2];
    
    //比较两个时间的大小
    NSComparisonResult result = [date1 compare:date2];
    
    //比较两个时间，返回 较早的时间
    NSDate *date3 = [date1 earlierDate:date2];
    
    //比较两个时间，返回 较晚的时间
    NSDate *date4 = [date1 laterDate:date2];
    
}

//4.NSDateComponents 的创建
- (void)createNSDateComponents{
    //手动设置创建
    NSDateComponents *compt1 = [[NSDateComponents alloc] init];
    
    //日历
    [compt1 setCalendar:[NSCalendar currentCalendar]];
    
    //时区
    [compt1 setTimeZone:[NSTimeZone systemTimeZone]];
    
    //纪元
    [compt1 setEra:1];
    
    //年
    [compt1 setYear:2016];
    
    //月
    [compt1 setMonth:3];
    
    //日
    [compt1 setDay:1];
    
    //时
    [compt1 setHour:00];
    
    //分
    [compt1 setMinute:00];
    
    //秒
    [compt1 setSecond:55];
    
    //微妙
    [compt1 setNanosecond:280];
    
    //刻钟
    [compt1 setQuarter:0];
    
    //周几
    [compt1 setWeekday:3];
    
    //指定日期为本月的第几个星期几
    [compt1 setWeekdayOrdinal:1];
    
    //指定日期是本月的第几周
    [compt1 setWeekOfMonth:1];
    
    //指定日期为本年的第几周
    [compt1 setWeekday:10];
    
    //指定 年
    [compt1 setYearForWeekOfYear:2016];
    
    
    //  由已知 date 创建
    /*
     只有明确指定了 unitFlags，NSDateComponents 相应的那一部分才有值
     */
    NSDateComponents *compt2 = [[NSCalendar currentCalendar] components:NSCalendarUnitEra
                                | NSCalendarUnitYear
                                | NSCalendarUnitMonth
                                | NSCalendarUnitDay
                                | NSCalendarUnitHour
                                | NSCalendarUnitMinute
                                | NSCalendarUnitSecond
                                | NSCalendarUnitNanosecond
                                | NSCalendarUnitQuarter
                                | NSCalendarUnitWeekday
                                | NSCalendarUnitWeekdayOrdinal
                                | NSCalendarUnitWeekOfMonth
                                | NSCalendarUnitWeekOfYear
                                | NSCalendarUnitYearForWeekOfYear
                                | NSCalendarUnitCalendar
                                | NSCalendarUnitTimeZone
                                
                                                               fromDate:[NSDate date]];
}

//5.NSDateComponents 时间间隔的计算
- (void)intervalOfNSDateComponents{
    NSData *date1 = [NSData data];
    NSData *date2 = [NSDate dateWithTimeInterval:5*60*69+75 sinceDate:date1];
    
    NSDateComponents *compt = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:date1 toDate:date2 options:0];
}

//6.NSDateComponents 与 NSDate 的相互装换
- (void)conversionNSDateComponentsWithNSDate{
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    //NSDate 转 NSDateComponents
    NSDateComponents *compt = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
    
    //NSDateComponents 转 NSDate
    //转换时间时，使用默认的时区 GMT 时区
    NSDate *date = [calendar dateFromComponents:compt];
    
    //得到本地时间，避免时区问题
    date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];
}

//7.NSDateComponents 与 NSDate的计算
- (void)NSDateComponentsAndNSDate{

    NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setDay:25];
    [compt setHour:4];
    [compt setMinute:66];
    
    //NSDate 加上 NSDateComponents 表示的一段时间
    NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:compt toDate:[NSDate date] options:0];
    
    //得到本地时间 避免时区问题
    date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];
    
}

//8.NSDateFormatter 的时间格式化
- (void)aboutNSDateFormatter{
    /*
     G -- 纪元                  一般会显示公元前(BC)和公元(AD)
     y -- 年                    假如是2013年，那么 yyyy=2013，yy=13
     M -- 月                    假如是3月，那么 M=3，MM=03，MMM=Mar，MMMM=March；假如是11月，那么M=11，MM=11，
     MMM=Nov，MMMM=November
     w -- 一年中的第几周         假如是1月8日，那么 w=2(这一年的第二个周)
     W -- 一个月中的第几周       与日历排列有关，假如是2013年4月21日，那么 W=4(这个月的第四个周)
     F -- 月份包含的周           与日历排列无关，和上面的 W 不一样，F 只是单纯以7天为一个单位来统计周，例如7号一定是第一个周，
     15号一定是第三个周，与日历排列无关。
     D -- 一年中的第几天         假如是1月20日，那么 D=20(这一年的第20天)；假如是2月25日，那么 D=31+25=56(这一年的第56天)
     d -- 一个月中的第几天       假如是5号，那么 d=5，dd=05   假如是15号，那么 d=15，dd=15
     E -- 星期几                假如是星期五，那么 E=Fri，EEEE=Friday
     a -- 上午(AM)/下午(PM)
     H -- 24小时制              显示为0--23，假如是午夜00:40，那么 H=0:40，HH=00:40
     h -- 12小时制              显示为1--12，假如是午夜00:40，那么 h=12:40
     K -- 12小时制              显示为0--11，假如是午夜00:40，那么 K=0:40，KK=00:40
     k -- 24小时制              显示为1--24，假如是午夜00:40，那么 k=24:40
     m -- 分钟                  假如是5分钟，那么 m=5，mm=05；假如是45分钟，那么 m=45，mm=45
     s -- 秒                    假如是5秒钟，那么 s=5，ss=05；假如是45秒钟，那么 s=45，ss=45
     S -- 毫秒                  一般用 SSS 来显示
     z -- 时区                  表现形式为 GMT+08:00
     Z -- 时区                  表现形式为 +0800
     */
    // 使用 NSDateFormatter 转换时间字符串时，默认的时区是系统时区，例如在中国一般都是北京时间(+8)，
    // 如果直接转换会导致结果相差8小时，所以一般的做法是先指定时区为GMT标准时间再转换。
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 设置时区，不设置时默认的时区是系统时区（GMT+8）
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    
    // 设置日期格式，以字符串表示的日期形式的格式
    [formatter setDateFormat:@"G yyyy-MM-dd E D F w W a z HH:mm:ss.SSS"];
    
    // 格式化日期，GMT 时间，NSDate 转 NSString
    NSString *str = [formatter stringFromDate:[NSDate date]];
    
}

//9、1437494603 (秒) 格式 转 YYYY-MM-dd HH:mm:ss 格式
- (void)examperOfNSDateFormatter{
    
    // 计算日期
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:1437494603];
    
    // 创建时间戳
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    // 设置日期格式，以字符串表示的日期形式的格式
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
    // 转换成指定的格式
    NSString *string = [formatter stringFromDate:date];
}
//10、NSDate 与 NSString 的相互转换
- (void)conversionNSDateAndNSString{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    // 设置时区 GMT
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    
    // 加入一些别的英文字符串时，需用单引号来引入
    [formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒 'iOS Date Test'"];
    
    // NSString 转 NSDate
    NSDate *date = [formatter dateFromString:@"2016年01月12日 1点8分50秒"];
    
    // NSDate 转 NSString
    NSString *str = [formatter stringFromDate:date];
}

//11、时区差值转换
- (void)differentTime{
    // 得到当前时间（世界标准时间 UTC/GMT）
    NSDate *date = [NSDate date];
    
    // 设置系统时区为本地时区
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    
    // 计算本地时区与 GMT 时区的时间差
    NSInteger interval = [zone secondsFromGMT];
    
    // 在 GMT 时间基础上追加时间差值，得到本地时间
    date = [date dateByAddingTimeInterval:interval];
}

@end
